# -*- coding: utf-8 -*-
"""
@Auth:
@Time: 2022-11-04 10:41
"""
import matplotlib.pyplot as plt
import pandas as pd
import main
from preHandle import to_date_type

# 数据可视化
import common


def draw_picture2():
    """
    理赔金额的累积分布图（对理赔金额取10的对数）
    """
    data_frame = pd.read_csv(common.PRE_HANDLED_DATA_PATH)

    data_frame["事故日期"] = pd.to_datetime(data_frame["事故日期"], errors='coerce')
    data_frame = data_frame.groupby([data_frame["事故日期"].dt.year, data_frame["事故日期"].dt.month])
    x_y_data = []
    for item in data_frame:
        date = to_date_type(item[0][0], item[0][1])
        month_total = item[1]["理赔金额"].sum()
        x_y_data.append([date, month_total])

    x_y_data = pd.DataFrame(columns=["事故日期", "月理赔总金额"], data=x_y_data)
    x_y_data = x_y_data.sort_values(by="事故日期", ascending=True)
    temp = 0
    arr = []
    for item in x_y_data["月理赔总金额"]:
        temp += item
        arr.append(temp)
    plt.plot(x_y_data["事故日期"], arr)
    plt.bar(x_y_data["事故日期"], arr)
    plt.show()


def draw_picture4():
    """
    :return:
    """
    data_frame = pd.read_csv(common.PRE_HANDLED_DATA_PATH)
    # 获取2020年数据
    data_frame = main.get_2020_data(data_frame)

    data_frame["事故日期"] = pd.to_datetime(data_frame["事故日期"], errors='coerce')
    data_frame = data_frame.groupby(data_frame["事故日期"].dt.month)
    cities = {"杭州市": [], "宁波市": []}
    for item in data_frame:
        data = item[1]
        date = item[1]["事故日期"]
        date = str(date.values[0])[:7]

        data_1 = data[data["事故发生城市名称"] == "杭州市"]
        data_1["伤亡总人数"] = data_1["受伤人数"] + data_1["死亡人数"]
        cities["杭州市"].append([date, data_1["伤亡总人数"].sum()])

        data_2 = data[data["事故发生城市名称"] == "宁波市"]
        data_2["伤亡总人数"] = data_2["受伤人数"] + data_2["死亡人数"]
        cities["宁波市"].append([date, data_2["伤亡总人数"].sum()])

    # 转为DataFrame对象
    hangzou_data = pd.DataFrame(columns=["事故日期", "月度伤亡总人数"], data=cities["杭州市"])
    ninbo_data = pd.DataFrame(columns=["事故日期", "月度伤亡总人数"], data=cities["宁波市"])
    print(hangzou_data)
    print(ninbo_data)


# 合并后数据集的存放路径
__MERGE_DATA_PATH = r"../resource/merge/overAll.csv"
data = pd.read_csv(__MERGE_DATA_PATH, low_memory=False, encoding="utf-8")
# 去除无关字段（无关字段为：是否删除, 备注, 签名值, 时间戳, 签名公钥证书, 签名hash值），生成新的数据集。请问，去除无关字段后，数据集还包括多少列？
# 20列

print("数据集剩余列数：", data.shape[1])
data.drop(['是否删除', '备注', '签名值', '时间戳', '签名公钥证书', '签名hash值'], axis=1, inplace=True)
print("数据集剩余列数：", data.shape[1])
# .2
# 检查数据中是否有重复记录等，若有，请采用合适的方法进行处理。请问，去除重复数据后，应有多少行数据？60317行
print("数据集剩余行数：", data.shape[0])
data.drop_duplicates(inplace=True)
print("数据集剩余行数：", data.shape[0])

# 对数据的质量进行分析，检查“投保公司流水号”是否存在缺失值、异常值等，并将“事故发生详细地址”调整到“理赔金额”的前一列。
count = 0
col = "投保公司流水号"
for i in data.index:
    if data[col][i] == str("无"):
        count = count + 1
        # data["投保公司流水号"][i] = None
print("缺失值数量：", count)
# 查看字符串类型数字的具体数据类别
data[col] = pd.to_numeric(data[col], errors='coerce')
# print(np.unique(data["投保公司流水号"].astype(str)))
# print(data["投保公司完整名称"].value_counts())
print(len(data))
bottom_quantile = data[col].quantile(q=0.75)
top_quantile = data[col].quantile(q=0.25)
# 分为数间距
distance = bottom_quantile - top_quantile
# 求数据上界和数据下界
# 这里假设为正态分布
k = 1.5
data_top = top_quantile + k * distance
data_bottom = bottom_quantile - k * distance
print('*' * 50)
print(data_top)
print(data_bottom)
# 异常值数量/删除有异常值的行
cnt = 0
for j in data[(data[col] < data_bottom) | (data[col] > data_top)].index:
    data.drop(j - cnt)
    cnt = cnt + 1
print('异常值数量：', cnt)
print(len(data))

old = list(data)
new = ['上报车辆出险数据流水号', '事故日期', '车辆流水号', '车牌号[冗余]', '底盘架号', '企业流水号', '企业完整名称', '企业社会信用代码', '保单编号[冗余]', '投保公司流水号',
       '投保公司完整名称', '事故发生省份名称', '事故发生城市名称', '事故发生地区名称', '事故发生详细地址', '理赔金额', '受伤人数', '死亡人数', '操作时间', '新增时间']
data = data[new]

# .4
# 请根据2020年车辆出险数量，对承保公司按车辆出险数量进行降序排序，给出承保数量前五的公司名称。
number = 5
# print(data["投保公司完整名称"].value_counts())
print("前五名承保公司:")
for i in data["投保公司完整名称"].value_counts().index:
    if number == 0:
        break
    if i != "无":
        print(i)
        number = number - 1
# 任务2
# .5
# 请给出2020年出险后获赔金额最多的5家企业（或个人）的企业完整名称及对应理赔金额。
print(data["投保公司完整名称"].value_counts())
